package com.haojin.java;

import org.junit.Test;

import java.util.*;

/**
 * @author .29.
 * @create 2022-04-12 7:45
 */
/*
泛型的使用
1.jdk 5.0新增的特性

2.杂技和中使用泛型：
  总结：
  ①集合接口后者集合类在jdk5.0时都修改为带泛型的结构。
  ②在实例化集合类时，可以指明具体的泛型类型
  ③指明完以后，在集合类或接口中凡是定义类和接口时，内部构造(方法，属性，构造器等)使用到类的泛型的位置，都指定为泛型类型
    比如：add(E e) --> 实例化以后：add(Integer e)
  ④注意点：泛型的类型必须是类，不能使用基本数据类型
  ⑤如果实例化时，没有指明泛型类型，默认类型为java.lang.Object类型

3.如何定义泛型结构：泛型类，泛型接口，泛型方法

 */
public class GenericTest {
    //集合在使用泛型之前的情况
    @Test
    public void test1(){
        ArrayList list = new ArrayList();
        list.add(88);
        list.add(89);
        list.add(98);
        list.add(68);
        //问题一：类型不安全
//        list.add("Tom");

        for (Object score :
                list) {
            //问题二：强转时可能出现：ClassCastException
            int stuScore = (Integer) score;
            System.out.println(stuScore);
        }
    }


    //在集合中使用泛型的情况
    @Test
    public void test2(){

        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(88);
        list.add(89);
        list.add(98);
        list.add(68);

        //编译时就会进行类型检查，保证数据安全
//        list.add("Tom");

        //方式一：
//        for (Integer score :
//                list) {
//            //避免了强转操作
//            int stuScore = score;
//            System.out.println(stuScore);
//        }

        //方式二：
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            int subScore = iterator.next();
            System.out.println(subScore);
        }
    }

    //在集合中使用泛型的情况：以HashMap为例
    @Test
    public void test3(){
//        HashMap<String, Integer> map = new HashMap<String, Integer>();
        //jdk7新特性：类型推断
        HashMap<String, Integer> map = new HashMap<>();
        map.put("mike",87);
        map.put("jerry",99);
        map.put("loser",29);
        //泛型的嵌套
        Set<Map.Entry<String,Integer>> entry =  map.entrySet();

        //遍历
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
        while(iterator.hasNext()){
            Map.Entry<String, Integer> e = iterator.next();
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key + "--->" + value);
        }


    }
}
